package Laborum2.repository;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import Laborum2.Basicas.Anunciantes;
import Laborum2.Basicas.Ofertas;

@Component
public class JdbcAnuncianteRepository implements AnuncianteRepository {

	@Autowired
	private DataSource dataSource;

	List<Anunciantes> anu = new ArrayList<Anunciantes>();
	List<Ofertas> ofe = new ArrayList<Ofertas>();

	Anunciantes anunciante = new Anunciantes();
	Ofertas oferta = new Ofertas();

	public List<Anunciantes> obtenerAnunciantes() {

		Anunciantes anunciante = new Anunciantes();
		List<Anunciantes> anu = new ArrayList<Anunciantes>();

		String sql = "SELECT * from Anunciantes where estado = 1";

		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			// Conexion
			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			while (rs.next()) {
				anunciante = new Anunciantes();
				// Cargo valores en la clase Anunciante
				anunciante.setRazsoc(rs.getString("razsoc"));
				anunciante.setRuc(rs.getString("ruc"));
				anunciante.setPais(rs.getInt("pais"));
				anunciante.setDepar(rs.getInt("depar"));
				anunciante.setProvincia(rs.getInt("provincia"));
				anunciante.setDistrito(rs.getInt("distrito"));
				anunciante.setDire(rs.getString("dire"));
				anunciante.setTelef(rs.getInt("telef"));
				anunciante.setRubro(rs.getString("rubro"));
				anunciante.setEstado(rs.getInt("estado"));

				// Cargo valores en la lista
				anu.add(anunciante);
			}
		} catch (Exception ex) {

		}
		// Cierro Conexion
		closeConecction(rs, ps, conn);

		// Retorno Lista
		return anu;
	}

	@Override
	public List<Anunciantes> obtenerAnunciantesCod(String ruc) {
		Anunciantes anunciante = new Anunciantes();
		List<Anunciantes> anu = new ArrayList<Anunciantes>();

		String sql = "SELECT * from Anunciantes where ruc = ?";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			// Conexion
			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			ps.setString(1, ruc);
			rs = ps.executeQuery();

			while (rs.next()) {
				anunciante = new Anunciantes();
				// Cargo valores en la clase anunciante
				anunciante.setRazsoc(rs.getString("razsoc"));
				anunciante.setRuc(rs.getString("ruc"));
				anunciante.setPais(rs.getInt("pais"));
				anunciante.setDepar(rs.getInt("depar"));
				anunciante.setProvincia(rs.getInt("provincia"));
				anunciante.setDistrito(rs.getInt("distrito"));
				anunciante.setDire(rs.getString("dire"));
				anunciante.setTelef(rs.getInt("telef"));
				anunciante.setRubro(rs.getString("rubro"));
				anunciante.setEstado(rs.getInt("estado"));

				// Cargo valores en la lista
				anu.add(anunciante);
			}
		} catch (Exception ex) {
		}
		// Cierro Conexion
		closeConecction(rs, ps, conn);
		// Retorno Lista
		return anu;
	}

	public String obtenerRucAnunciante(String ruc) {
		for (int i = 0; i < anu.size(); i++) {
			if (anu.get(i).getRuc() == ruc) {
				return anu.get(i).getRuc();
			}
		}
		return "";

	}

	public void ingresarAnunciantes(Anunciantes anunciante) {
		if (obtenerRucAnunciante(anunciante.getRuc()) == "") {

			String sql = "insert into Anunciantes (razsoc, ruc, pais, depar, provincia, distrito, dire, telef, rubro, estado) "
					+ "values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
			Connection conn = null;
			PreparedStatement ps = null;

			try {
				// Conexion
				conn = dataSource.getConnection();
				ps = conn.prepareStatement(sql);

				ps.setString(1, anunciante.getRazsoc());
				ps.setString(2, anunciante.getRuc());
				ps.setInt(3, anunciante.getPais());
				ps.setInt(4, anunciante.getDepar());
				ps.setInt(5, anunciante.getProvincia());
				ps.setInt(6, anunciante.getDistrito());
				ps.setString(7, anunciante.getDire());
				ps.setInt(8, anunciante.getTelef());
				ps.setString(9, anunciante.getRubro());
				ps.setInt(10, anunciante.getEstado());

				// Ejecuto Query
				ps.execute();

			} catch (Exception ex) {
			}
			anu.add(anunciante);
		} else {
			throw new RuntimeException("Anunciante ya registrado");
		}
	}

	public void editar(String ruc, Anunciantes anunciante) {
		if (obtenerAnunciantesCod(anunciante.getRuc()).size() > 0) {

			String sql = "update Anunciantes set razsoc = ?, pais = ?, depar = ?, provincia = ?, distrito = ?, dire = ?, telef = ?, rubro 	= ?, estado = ?  Where ruc = ?";

			Connection conn = null;
			PreparedStatement ps = null;
			try {
				// Conexion
				conn = dataSource.getConnection();
				ps = conn.prepareStatement(sql);

				// Asigna Valores
				ps.setString(1, anunciante.getRazsoc());
				ps.setInt(2, anunciante.getPais());
				ps.setInt(3, anunciante.getDepar());
				ps.setInt(4, anunciante.getProvincia());
				ps.setInt(5, anunciante.getDistrito());
				ps.setString(6, anunciante.getDire());
				ps.setInt(7, anunciante.getTelef());
				ps.setString(8, anunciante.getRubro());
				ps.setInt(9, anunciante.getEstado());
				ps.setString(10, anunciante.getRuc());

				// Ejecuto Query
				ps.executeUpdate();
			} catch (Exception ex) {

			}
			// Cierro Conexion
			closeConecction1(ps, conn);
		} else {
			throw new RuntimeException("Anunciante no existe");
		}
	}

	public void eliminarAnunciante(String ruc) {
		String sql = "update Anunciantes set estado = 0 where ruc = ?";
		Connection conn = null;
		PreparedStatement ps = null;

		try {

			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			ps.setString(1, ruc);
			ps.execute();

		} catch (SQLException ex) {

		}
		closeConecction1(ps, conn);
	}

	private void closeConecction(ResultSet rs, PreparedStatement ps,
			Connection conn) {

		if (rs != null) {
			try {
				// Close to prevent database cursor exhaustion
				rs.close();
			} catch (SQLException ex) {
			}
		}
		if (ps != null) {
			try {
				// Close to prevent database cursor exhaustion
				ps.close();
			} catch (SQLException ex) {
			}
		}
		if (conn != null) {
			try {
				// Close to prevent database connection exhaustion
				conn.close();
			} catch (SQLException ex) {
			}
		}

	}

	private void closeConecction1(PreparedStatement ps, Connection conn) {

		if (ps != null) {
			try {
				// Close to prevent database cursor exhaustion
				ps.close();
			} catch (SQLException ex) {
			}
		}
		if (conn != null) {
			try {
				// Close to prevent database connection exhaustion
				conn.close();
			} catch (SQLException ex) {
			}
		}
	}

}
